package main.leetcode.clockin.July;

import main.datastruc.TreeNode;

import java.util.ArrayList;
import java.util.List;

/**
 * 95. 不同的二叉搜索树 II
 *
 * <p>给定一个整数 n，生成所有由 1 ... n 为节点所组成的 二叉搜索树 。
 *
 * <p>示例：<br>
 * 输入：3 <br>
 * 输出： [   <br>
 * [1,null,3,2],   <br>
 * [3,2,null,1],   <br>
 * [3,1,null,null,2],   <br>
 * [2,1,3], <br>
 * [1,null,2,null,3] <br>
 * ]
 *
 * <p>来源：力扣（LeetCode） 链接：https://leetcode-cn.com/problems/unique-binary-search-trees-ii
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class day21 {
    public List<TreeNode> generateTrees(int n) {
        if (n < 1) {
            return new ArrayList<>();
        }
        return generateTrees(1, n);
    }

    private List<TreeNode> generateTrees(int start, int end) {
        List<TreeNode> res = new ArrayList<>();
        if (start > end) {
            res.add(null);
            return res;
        }
        for (int i = start; i <= end; ++i) {
            List<TreeNode> left = generateTrees(start, i - 1);
            List<TreeNode> right = generateTrees(i + 1, end);

            for (TreeNode leftTree : left) {
                for (TreeNode rightTree : right) {
                    TreeNode root = new TreeNode(i);
                    root.left = leftTree;
                    root.right = rightTree;
                    res.add(root);
                }
            }
        }
        return res;
    }
}
